use std::io;

// crate 是一个代码包，如下rand是一个库crate，本程序是一个可执行crate；
use rand::Rng; // Rng是一个trait

use std::cmp::Ordering; // 枚举Ordering: Less、Greater、Equal

fn main() {
    println!("猜字游戏开始了......");

    // 生成随机数
    let _secret_num: u32= rand::thread_rng().gen_range(1..101);

    loop {
        println!("请输入数字：");

        // 变量默认不可变，mut表示可变；
        let mut guess = String::new(); // new()是String类型的关联函数，采用静态方法new()创建实例是一种惯例。
        io::stdin()
            .read_line(&mut guess) // &表示参数是一个引用，引用默认也是不可变的。
            .expect("读取输入错误"); // 返回 Result类型（枚举：Ok、Err）
        
        // str -> number
        let guess: u32 = match guess.trim().parse() { // parse()实现字符串转换为数字
            Ok(num) => num,
            Err(_) => {
                println!("请输入整数");
                continue;
            }
        };

        // {}占位符
        println!("你猜的数字是：{}", guess);
    
        // match 模式匹配
        match guess.cmp(&_secret_num) {
            Ordering::Less => println!("太小了！"),
            Ordering::Greater => println!("太大了！"),
            Ordering::Equal => {
                println!("猜对了！！！！");
                break;
            }
        }
    
    }
}
